﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using Onshi.POS.AccesoDatos;
using Onshi.POS.AccesoDatos.Interfaces;
using Onshi.POS.Modelo.Entidades;

namespace Onshi.POS.Repositorios
{
    public class RepositorioCuentasContables : RepositorioEntidad<CuentaContable, Int32>
    {
        #region Constructores
        public RepositorioCuentasContables() : base()
        {
            servicioDatosCuentasContables = new ServicioDatosCuentasContables();
        }

        #endregion

        #region Atributos

        private IServicioDatosCuentasContables servicioDatosCuentasContables;

        #endregion

        #region Propiedades

        private IServicioDatosCuentasContables ServicioDatosCuentasContables
        {
            get { return new ServicioDatosCuentasContables(); }
        }

        private RepositorioTiposCuentasContables RepositorioTiposCuentasContables
        {
            get { return new RepositorioTiposCuentasContables(); }
        }

        #endregion

        #region Metodos

        protected override CuentaContable FilaAEntidad(DataRow fila)
        {
            CuentaContable cuentaContable = new CuentaContable();
            cuentaContable.Id = (Int32)fila["IdCuenta"];
            cuentaContable.Nombre = (String)fila["Nombre"];

            if (fila["idTipoCuenta"] != null && fila["idTipoCuenta"].ToString() != String.Empty)
                cuentaContable.TipoCuentaContable = RepositorioTiposCuentasContables.DevolverPorId ((Int32)fila["idTipoCuenta"]);

            cuentaContable.Activo = (Boolean)fila["activo"];
            return cuentaContable;
        }

        public override CuentaContable DevolverPorId(Int32 id)
        {
            CuentaContable entidad = (from CuentaContable item in entidades where item.Id == id select item).FirstOrDefault();
            if (entidades != null)
            {
                using (DataSet ds = ServicioDatosCuentasContables.CuentasContables_DevolverPorId(id))
                {
                    if (ds.Tables[0].Rows.Count != 0)
                    {
                        entidad = FilaAEntidad(ds.Tables[0].Rows[0]);
                        entidades.Add(entidad);
                    }
                }
            }
            return entidad;
        }

        public void Insertar(CuentaContable entidad)
        {
            entidad.Id = ServicioDatosCuentasContables.CuentasContables_Insertar(entidad.Nombre, entidad.TipoCuentaContable.Id, entidad.Activo);
        }

        public void Modificar(CuentaContable entidad)
        {
            ServicioDatosCuentasContables.CuentasContables_Modificar(entidad.Id, entidad.Nombre, entidad.TipoCuentaContable.Id, entidad.Activo);
        }

        public void Eliminar(CuentaContable entidad)
        {
            ServicioDatosCuentasContables.CuentasContables_Eliminar(entidad.Id);
            entidad = null;
        }

        public List<CuentaContable> DevolverTodos()
        {
            using (DataSet ds = ServicioDatosCuentasContables.CuentasContables_DevolverTodos())
            {
                entidades = TablaALista(ds.Tables[0]);
            }
            return entidades;
        }

        #endregion
    }
}
